//一，什么是运算符？
// 运算符：下述 + 和 < 等就是运算符，即：对操作数进⾏操作时的符号，不同运算符操作的含义不同。
//作为⼀⻔计算机语⾔，Java也提供了⼀套丰富的运算符来操纵变量。Java中运算符可分为以下：
// 算术运算符(+ - * / %)、关系运算符(>= <= < > == !=)、逻辑运算符（&& || ！）、位运算符（& |^ ~)、移位运算符（<< >> >>>）以及条件运算符（？：：）等


public class J20250225 {
    public static void main1(String[] args) {
        int a = 10;
        int b = 20;
        System.out.println(a + b);//30
        System.out.println(a < b);//true
    }



    //二.算术运算符 + - * / %
    //1. 基本四则运算符：加减乘除模 + - * / %
    //都是⼆元运算符，使⽤时必须要有左右两个操作数
    public static void main2(String[] args) {
        int a = 5;
        int b = 2;
        System.out.println(a + b); // 7
        System.out.println(a - b); // 3
        System.out.println(a * b); // 10
        System.out.println(a / b); // 2  b不能为0 int/int结果还是int类型，⽽且会向下取整(即省略小数点后面所有数字） 若要得到数学结果则 a*1.0 / b
        System.out.println(a % b); // 1  b不能为0 结果符号与a一致 区别：在java中%两边可以是小数而C语言只能是整数 --->模运算相当于数学中除法的余数 也可以对double类型取模但无意义

        double c = 5.0;
        int d = 2;
        System.out.println(c / d);//两侧操作数类型不⼀致时，向类型⼤的提升 2.5
    }
    public static void main3(String[] args) {
        short a = 128;
        byte b = (byte) a;
        System.out.println(b);//-128
    }

    //2.增量运算符+= -= *= %=
    public static void main4(String[] args) {
        int a = 1;
        a += 2;                // 相当于 a = a + 2
        System.out.println(a); // 输出3

        a -= 1;                // 相当于 a = a - 1
        System.out.println(a); // 输出2

        a *= 3;                // 相当于 a = a * 3
        System.out.println(a); // 输出6

        a /= 3;                // 相当于 a = a / 3
        System.out.println(a); // 输出2

        a %= 3;                // 相当于 a = a % 2
        System.out.println(a); // 输出2


        //增量运算符在计算的时候，可以不进⾏强制类型转换
        double b = 10.4;
        int c = 10;
        c += b;                 //20 不会报错   若写成c = c + b; //此时会编译报错，等号右边被提升为了double类型
        System.out.println(c);

    }

    //3.⾃增/⾃减运算符 ++ --
    //++是给变量的值+1，--是给变量的值-1。
    public static void main5(String[] args) {
        int a = 1;
        a++;                      // 后置++ 表⽰给a的值加1，此时a的值为2
        System.out.println(a++);  // 注意：后置++是先使⽤变量原来值，表⽰式结束时给变量+1，因此输出2
        System.out.println(a);    // 输出3
        ++a;                      // 前置++ 表⽰给a的值加1
        System.out.println(++a);  // 注意：前置++是先给变量+1，然后使⽤变量中的值，因此输出5
        System.out.println(a);    // 输出5

        // --操作符给操作-1，与++含义类似
        //• 如果单独使⽤，【前置++】和【后置++】没有任何区别
        // • 如果混合使⽤，【前置++】先+1，然后使⽤变量+1之后的值，【后置++】先使⽤变量原来的值，
        // 表达式结束时给变量+1，只有变量才能使⽤⾃增/⾃减运算符，常量不能使⽤，因为常量不允许被修改

    }

    //三，关系运算符
    public static void main6(String[] args) {
        int a = 10;
        int b = 20;
        // 注意：在Java中 = 表⽰赋值，要与数学中的含义区分
        // 在Java中 == 表⽰相等
        System.out.println(a == b); // false
        System.out.println(a != b); // true
        System.out.println(a < b);  // true
        System.out.println(a > b);  // false
        System.out.println(a <= b); // true
        System.out.println(a >= b); // false
        //注意：当需要多次判断时，不能连着写，⽐如：3<a<5，Java程序与数学中是有区别的
    }

//四，逻辑运算符（重点）
    //逻辑运算符主要有三个: && || ! ，运算结果都是boolean类型。

    //1.逻辑与&&
    //如果左侧表达式值为false,则不执行右侧表达式，结果⼀定是false,⽆需计算右侧表达式(短路）
    //语法规则：表达式1&&表达式2，左右表达式必须是boolean类型的结果。
    //相当于现实⽣活中的且，⽐如：如果是学⽣，并且带有学⽣证才可以享受半票。
    //两个表达式都为真，结果才是真，只要有⼀个是假，结果就是假。

    //表达式1 表达式2  结果
    //  真     真     真
    //  真     假     假
    //  假     真     假
    public static void main7(String[] args) {
        int a = 1;
        int b = 2;
        System.out.println(a == 1 && b == 2); // 左为真 且 右为真 则结果为真
        System.out.println(a == 1 && b > 100); // 左为真 但 右为假 则结果为假
        System.out.println(a > 100 && b == 2); // 左为假 但 右为真 则结果为假
        System.out.println(a > 100 && b > 100); // 左为假 且 右为假 则结果为假
    }

    //2.逻辑或||
    //如果左侧表达式值为true,则不执行右侧表达式，结果⼀定是true,⽆需计算右侧表达式（短路）
    //语法规则：表达式1||表达式2，左右表达式必须是boolean类型的结果。
    //相当于现实⽣活中的或，⽐如：买房⼦交钱时，全款或者按揭都可以，如果全款或者按揭，房⼦都是你的，否则站⼀边去。

    //表达式1 表达式2 结果
    //  真     真    真
    //  真     假    真
    //  假     真    真
    //  假     假    假
    public static void main8(String[] args) {
        int a = 1;
        int b = 2;
        System.out.println(a == 1 || b == 2); // 左为真 且 右为真 则结果为真
        System.out.println(a == 1 || b > 100); // 左为真 但 右为假 则结果也为真
        System.out.println(a > 100 || b == 2); // 左为假 但 右为真 则结果也为真
        System.out.println(a > 100 || b > 100); // 左为假 且 右为假 则结果为假
    }

    //3.逻辑非！
    //语法规则 !表达式
    //真变假，假变真。
    public static void main9(String[] args) {
        int a = 10;
        boolean flg = !(a == 10);
        System.out.println(flg);//false 逻辑非只能是布尔表达式
    }

    //4.短路求值
    // & 和 |如果表达式结果为boolean时,也表⽰逻辑运算，但与 && ||相⽐,它们不⽀持短路求值.
    public static void main10(String[] args) {
        System.out.println(10 > 20 && 10 / 0 == 0); // 打印 false
        System.out.println(10 < 20 || 10 / 0 == 0); // 打印 true
        //我们都知道,计算10 / 0 会导致程序抛出异常.但是上面的代码却能正常运⾏,说明10 / 0 并没有真正被求值.

        System.out.println(10 > 20 & 10 / 0 == 0); // 程序抛出异常  不具有短路特性。无论第一个操作数的结果如何，都会计算第二个操作数
        System.out.println(10 < 20 | 10 / 0 == 0); // 程序抛出异常  不具备短路特性。无论第一个操作数的结果是什么，都会去计算第二个操作数。
    }


//五，位运算符
    //Java中数据存储的最⼩单位是字节，⽽数据操作的最⼩单位是⽐特位.字节是最⼩的存储单位，每个
    //字节是由8个⼆进制⽐特位组成的，多个字节组合在⼀起可以表⽰各种不同的数据。
    //位运算符主要有四个: & | ~ ^ ，除 ~ 是⼀元运算符外，其余都是⼆元运算符。
    //位操作表⽰按⼆进制位运算.计算机中都是使⽤⼆进制来表⽰数据的(01构成的序列),按位运算就是在
    //按照⼆进制位的每⼀位依次进⾏计算.

    //1.按位与&:如果对应位两个⼆进制位都是1,则结果为1,否则结果为0.
    public static void main11(String[] args) {
        //1.按位与&:如果对应位两个⼆进制位都是1,则结果为1,否则结果为0.
        int a = 10;              //10的二进制为00001010
        int b = 20;              //20的二进制为00010100
        System.out.println(a & b);//0，二进制为00000000

        //2. 按位或|:如果两个⼆进制位都是0,则结果为0,否则结果为1.
        int c = 10;                         //00001010
        int d = 20;                         //00010100
        System.out.println(c | d);//30，二进制为00011110
        //注意:当&和|的操作数为整数(int,short,long,byte)的时候,表⽰按位运算,当操作数为boolean的时候,表⽰逻辑运算.

        //3. 按位取反~:如果该位为0则转为1,如果该位为1则转为0
        int e = 0xf;
        System.out.printf("%x\n", ~e);
        //注意:
        //• 0x前缀的数字为⼗六进制数字.⼗六进制可以看成是⼆进制的简化表⽰⽅式.⼀个⼗六进制数字对应4个⼆进制位.
        //• 0xf表⽰10进制的15,也就是⼆进制的1111
        //• printf能够格式化输出内容,%x表⽰按照⼗六进制输出.
        //• \n表⽰换⾏符

        //4. 按位异或^:如果两个数字的⼆进制位相同,则结果为0,相异则结果为1
        int f = 0x1;
        int g = 0x2;
        System.out.printf("%x\n", f ^ g);//3
        //注意：如果两个数相同，则异或的结果为0
    }


}